package LIst;

import java.util.Arrays;

//单链表：数组实现
public class MyArrayList {
    private int[] elem;//用数组来实现顺序表，
    private int usedSize;//记录那些是有效数据

    private static final int DEFAULT_SIZE=2;
    //默认构造方法：
    public MyArrayList(){
        this.elem=new int[DEFAULT_SIZE];
    }
    MyArrayList(int length){
        this.elem=new int[length];
        //
    }
    private boolean isFull(){
        if(this.usedSize==this.elem.length){
            return true;
        }
        return false;
    }
    //新增元素，默认在数组最后新增
    public void add(int data){
        if(isFull()){
            //扩容
            this.elem= Arrays.copyOf(this.elem,2*this.elem.length);
            //2倍的扩容
            //或者最后用定义的usedSize,也是可以的
        }
        this.elem[this.usedSize]=data;//尾巴插入
        this.usedSize++;

    }
    public void add(int pos,int data){//
        if(isFull()){
            //扩容就和搬家一样，
            //你从小房子到大房子，自己的小房子的东西就不要了吗？
            this.elem= Arrays.copyOf(this.elem,2*this.elem.length);
            //或者最后用定义的usedSize,也是可以的
        }

        if(pos>usedSize||pos<0){//
            throw new PosOutOFBoundsException(pos+"位置不合法!");
            //System.out.println("位置不合法！！！");
        }
        for (int i = this.usedSize-1; i >=pos ; i--) {
            this.elem[i+1]=this.elem[i];//在最后一次，
        }
        this.elem[pos]=data;//想办法绕过i，直接使用pos
       this.usedSize++;
    }
    public boolean contains (int toFind){
        for (int i = 0; i <this.usedSize ; i++) {
            if(toFind==this.elem[i]){//如果是引用类型，那么要重写equals方法
                //也可以去使用比较器
                //返回值的差异
                //equals只有两个值，非常的单纯
                return true;
            }
        }
        return false;
    }
    public int index(int toFind){
        for (int i = 0; i <this.usedSize ; i++) {
            if(toFind==this.elem[i]){
                return i;
            }
        }
        return -1;
    }
    public int get(int pos){
        if(pos>0&&pos<usedSize) {
            return this.elem[pos];
        }
        throw new PosOutOFBoundsException(pos+"位置不合法！");
    }
    public void set(int pos,int value){
        if(isFull()){
            //扩容就和搬家一样，
            //你从小房子到大房子，自己的小房子的东西就不要了吗？
            this.elem= Arrays.copyOf(this.elem,2*this.elem.length);
            //或者最后用定义的usedSize,也是可以的
        }
        if(pos>usedSize||pos<0){//不能长于数组连续长度
            throw new PosOutOFBoundsException(pos+"位置不合法!");
            //System.out.println("位置不合法！！！");
        }
        this.elem[pos]=value;
    }
    public void reMove(int toRemove){
        for (int i = 0; i < this.usedSize; i++) {
            if(toRemove==this.elem[i]){
                for (int j = i; j <this.usedSize ; j++) {
                    this.elem[j]=this.elem[j+1];
                }
                this.usedSize--;
                break;
            }
        }
    }

    public int size(){
        return usedSize;
    }
    public void clear(){
        usedSize=0;
    }
    public void display(){
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i]+" ");
        }
    }
}
class Test{
    public static void main(String[] args) {
        MyArrayList myArrayList=new MyArrayList();
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(3);
        myArrayList.add(4);
        myArrayList.add(5);
        myArrayList.add(1,99);
        System.out.println(myArrayList.contains(1));
        System.out.println(myArrayList.contains(10));
        System.out.println(myArrayList.get(1));
        System.out.println(myArrayList.size());
        myArrayList.reMove(1);
        myArrayList.clear();
        myArrayList.display();

    }
}
